package com.java.basis.io.nio.buffer;

import org.junit.Test;

import java.nio.ByteBuffer;

/**
 * 对缓冲区的常用api进行案例实现
 * Buffer clear() 清空缓冲区并返回对缓冲区的引用
 * Buffer flip() 将缓冲区的界限设置为当前位置，并将当前位置重置为 0
 * int capacity() 返回 Buffer 的 capacity 大小
 * boolean hasRemaining() 判断缓冲区中是否还有元素
 * int limit(int n) 设置缓冲区界限为 n，并返回一个具有新 limit 的缓冲区对象
 * Buffer mark() 对缓冲区设置标记
 * int position() 返回缓冲区的当前位置
 * Buffer position(int n) 设置缓冲区的当前位置为 n，并返回修改后的 Buffer 对象
 * int remaining() 返回 position 和 limit 之间的元素个数
 * Buffer reset() 将位置 position 转到以前设置的 mark 所在的位置
 * Buffer rewind() 将位置设置为 0，取消设置的 mark
 * 
 * @author wangning
 * @create 2022-01-10 10:05
 */
public class BufferTest {

	@Test
	public void test01() {
		//分配一个缓冲区，设置存储容量为10
		ByteBuffer buffer = ByteBuffer.allocate(10);
		System.out.println(buffer.position());
		System.out.println(buffer.limit());
		System.out.println(buffer.capacity());
		System.out.println("-----------------------");
		//put,向缓冲区添加数据
		String name = "javaee";
		buffer.put(name.getBytes());
		System.out.println(buffer.position());
		System.out.println(buffer.limit());
		System.out.println(buffer.capacity());

		//Buffer flip() 将缓冲区的界限设置为当前位置，并将当前位置重置为 0, 可读模式
		System.out.println("-----------------------");
		buffer.flip();
		System.out.println(buffer.position());
		System.out.println(buffer.limit());
		System.out.println(buffer.capacity());
		System.out.println(buffer.hasRemaining());//true
		System.out.println(buffer.hasArray());//true
		System.out.println(buffer.hashCode());//1708179957

		//get数据读取
		System.out.println("------------------------");
		char ch = (char) buffer.get();
		System.out.println(ch);
		System.out.println(buffer.position());
		System.out.println(buffer.limit());
		System.out.println(buffer.capacity());



	}

	@Test
	public void test02() {
		//分配一个缓冲区，设置存储容量为10
		ByteBuffer buffer = ByteBuffer.allocate(10);
		System.out.println(buffer.position());
		System.out.println(buffer.limit());
		System.out.println(buffer.capacity());
		System.out.println("-----------------------");
		//put,向缓冲区添加数据
		String name = "javaee";
		buffer.put(name.getBytes());
		System.out.println(buffer.position());
		System.out.println(buffer.limit());
		System.out.println(buffer.capacity());
		//clear清除缓冲区的数据,clear方法并没有清除数据，只是回到了起始位置
		//只有我们在添加数据的时候才会清除
		System.out.println("---------------------------");
		buffer.clear();
		System.out.println(buffer.position());
		System.out.println(buffer.limit());
		System.out.println(buffer.capacity());
		System.out.println((char) buffer.get());

		//定义一个新的缓冲区
		System.out.println("--------------------");
		ByteBuffer buf = ByteBuffer.allocate(10);
		buf.put("admin".getBytes());
		buf.flip();
		byte[] bytes = new byte[2];
		buf.get(bytes);
		String rs = new String(bytes);
		System.out.println(rs);
		System.out.println(buf.position());//2
		System.out.println(buf.limit());//5
		System.out.println(buf.capacity());//10
		buf.mark();//标记此位置
		System.out.println("-------------------");

		byte[] b2 = new byte[3];
		buf.get(b2);
		String r = new String(b2);
		System.out.println(buf.position());//2
		System.out.println(buf.limit());//5
		System.out.println(buf.capacity());//10

		System.out.println("----------------------");
		buf.reset();
		if(buf.hasRemaining()) {
			System.out.println(buf.remaining());

		}


	}

	@Test
	public void test03() {
		//1.创建一个直接内存的缓冲区,直接内存在申请的时候会消耗更多的性能
		ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
		System.out.println(buffer.isDirect());
	}

}
